在現代應用程式的開發和維運過程中,安全地處理包括 API 密鑰、資料庫憑證、OAuth token 等,敏感資訊變得非常重要。如果這些資訊被未經授權的用戶取得,會導致嚴重的後果。Kubernetes 提供了 Secrets 這個資源來安全地存儲和管理敏感資訊,並確保應用程式可以安全地存取這些資訊。
Kubernetes Secrets 是用來存儲敏感資訊的資源。它能夠將敏感資訊從容器映像中分離出來,從而避免將憑證或密碼寫死在應用程式內部。通過使用 Secrets,應用程式可以在運行時從 Kubernetes 中安全地獲取這些敏感資料,而不需要將它們暴露在應用程式碼中。
敏感資訊的保護 是任何現代應用的核心要素。若不適當地保護這些資訊,將會給系統帶來極大的安全風險。
支援不同類型的 Secrets,其中最常見的包括:
我們可以通過以下兩種方式來創建 Secrets,假設要創建一個包含資料庫憑證的 Secret:
使用命令行工具 kubectl
kubectl create secret generic db-credentials --from-literal=username=myuser --from-literal=password=mypassword
上述命令會創建一個名為 db-credentials
的 Secret,並且將 username
和 password
以 Key-Value 的形式存儲在裡面。
使用 YAML 文件
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
data:
username: bXl1c2Vy # 'myuser' 的 base64 編碼
password: bXlwYXNzd29yZA== # 'mypassword' 的 base64 編碼
使用 base64 編碼是 Kubernetes 在處理 Secrets 時的常見方式,因此每一個 data
值都需要進行編碼。
將 Secrets 注入 Pod 有兩種常見的方法:
通過環境變量 (Environment Variables)
在 Pod 的定義中,可以通過環境變量來存取 Secrets。例如:
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: mycontainer
image: nginx
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-credentials
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password
在這個配置中,DB_USERNAME
和 DB_PASSWORD
會被從 Secrets 中讀取,並且作為環境變量注入到容器中。
通過掛載為 Volume
另一種方式是將 Secrets 掛載為 Volume,讓應用程式從文件系統中讀取敏感資訊:
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: mycontainer
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: db-credentials
在這種情境下,/etc/secret
目錄會包含 db-credentials
Secret 中的所有 Key-Value,應用程式可以直接讀取該目錄中的文件來存取敏感資訊。
Kubernetes Secrets 是保護應用敏感資訊的核心工具。通過正確使用 Secrets,DevOps 團隊可以有效地保護關鍵資訊,並確保應用程式的安全性。無論是通過環境變量還是 Volume 掛載,Kubernetes 都能夠靈活且安全地將敏感資訊提供給運行中的容器!